//package com.diaohaiwen.module.metadata.service.execute;
//
//import cn.hutool.core.bean.BeanUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.diaohaiwen.platform.common.util.JsonUtil;
//import com.diaohaiwen.module.metadata.handler.MetadataTenantHandler;
//import com.diaohaiwen.platform.remote.metadata.obj.bo.ParamBO;
//import jakarta.annotation.Resource;
//import org.springframework.stereotype.Service;
//
//import java.util.*;
//import java.util.concurrent.atomic.AtomicInteger;
//import java.util.stream.Collectors;
//
//import static com.diaohaiwen.platform.common.util.JsonUtil.toJsonString;
//import static com.diaohaiwen.platform.common.util.ValueUtil.INTEGER_ZERO;
//
//@Service
//public class ParamInsertExecute extends ServiceImpl<TableParamMapper, TableParamDO> implements BaseExecute<TableParamDO> {
//
//    @Resource
//    private DynamicTableMapper dynamicTableMapper;
//
//    @Resource
//    private TableColumnMapper tableColumnMapper;
//
//    public Boolean execute(String sourceId, List<ParamBO> rows) {
//        Set<String> attributeIds = rows.stream().map(ParamBO::getAttributeId).collect(Collectors.toSet());
//        // 查询数据表
//        Map<String, DynamicTableDO> attributeMap = dynamicTableMapper.selectBatchIds(attributeIds).stream().collect(Collectors.toMap(DynamicTableDO::getId, e -> e));
//        // 查询属性
//        Map<String, Map<String, TableColumnDO>> itemMap = findColumns(attributeIds).stream().collect(Collectors.groupingBy(TableColumnDO::getTableId, Collectors.toMap(TableColumnDO::getColumnCode, e -> e)));
//
//        List<TableParamDO> list = rows.stream()
//                .map(value -> {
//                    if (Boolean.TRUE.equals(value.getMultiple())) {
//                        AtomicInteger atomic = new AtomicInteger(INTEGER_ZERO);
//                        return value.getValues().stream().map(v ->
//                                        cellToRow(sourceId, attributeMap.get(value.getAttributeId()), itemMap.get(value.getAttributeId()), v, atomic.getAndIncrement()))
//                                .flatMap(List::stream)
//                                .toList();
//                    } else {
//                        return cellToRow(sourceId, attributeMap.get(value.getAttributeId()), itemMap.get(value.getAttributeId()), value.getValue(), INTEGER_ZERO);
//                    }
//                }).flatMap(List::stream)
//                .toList();
//
//        return this.saveBatch(list, list.size());
//    }
//
//    private List<TableColumnDO> findColumns(Collection<String> tableIds) {
//        LambdaQueryWrapper<TableColumnDO> wrapper = Wrappers.lambdaQuery();
//        wrapper.in(TableColumnDO::getTableId, tableIds);
//        return tableColumnMapper.selectList(wrapper);
//    }
//
//    /**
//     * 列转行
//     *
//     * @param sourceId 数据来源
//     * @param table    自定义属性
//     * @param itemMap  自定义属性项
//     * @param value    参数值
//     * @param sort     排序
//     */
//    private List<TableParamDO> cellToRow(String sourceId, DynamicTableDO table, Map<String, TableColumnDO> itemMap, Map<String, Object> value, int sort) {
//
//        List<TableParamDO> params = new ArrayList<>();
//
//        value.forEach((code, v) -> {
//            TableColumnDO item = itemMap.get(code);
//            TableParamDO build = TableParamDO.create()
//
//                    .setTableId(table.getId())
//                    .setTableCode(table.getCode())
//                    .setTableName(table.getName())
//                    .setVersion(table.getVersion())
//                    .setColumnId(item.getId())
//                    .setColumnName(item.getColumnName())
//                    .setColumnName(item.getColumnCode())
//                    .setColumnType(item.getColumnType())
//                    .setUnit(item.getUnit())
//                    .setSort(sort)
//                    .setSourceId(sourceId)
//                    .setDatasource(MetadataTenantHandler.getTenantColumn());
//
//            if (v instanceof List<?> list) {
//
//                list.forEach(l -> {
//                    TableParamDO properties = BeanUtil.copyProperties(build, TableParamDO.class);
//                    properties.setVal(toJsonString(l));
//                    params.add(properties);
//                });
//            } else {
//                build.setVal(JsonUtil.toJsonEmpty(v));
//                params.add(build);
//            }
//        });
//
//        return params;
//    }
//
//}
